home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 2000 July: Mac OS SDK / Dev.CD Jul 00 SDK2.toast / Development Kits / Cross Platform / QuickTime 4.1.2 Windows SDK / CIncludes / QD3DGroup.h < prev    next >
Encoding:
C/C++ Source or Header  |  2000-04-12  |  15.7 KB  |  508 lines  |  [TEXT/R*ch]

  1. /*
  2.      File:        QD3DGroup.h
  3.  
  4.      Contains:    Q3Group methods        
  5.  
  6.      Version:    Technology:    Quickdraw 3D 1.6
  7.                  Release:    QuickTime 4.1
  8.  
  9.      Copyright:    (c) 1995-1999 by Apple Computer, Inc., all rights reserved.
  10.  
  11.      Bugs?:        For bug reports, consult the following page on
  12.                  the World Wide Web:
  13.  
  14.                      http://developer.apple.com/bugreporter/
  15.  
  16. */
  17. #ifndef __QD3DGROUP__
  18. #define __QD3DGROUP__
  19.  
  20. #ifndef __QD3D__
  21.     #include <QD3D.h>
  22. #endif
  23.  
  24.  
  25.  
  26.  
  27. #if PRAGMA_ONCE
  28. #pragma once
  29. #endif
  30.  
  31. #ifdef __cplusplus
  32. extern "C" {
  33. #endif
  34.  
  35. #if PRAGMA_IMPORT
  36. #pragma import on
  37. #endif
  38.  
  39. #if PRAGMA_STRUCT_ALIGN
  40.     #pragma options align=power
  41. #elif PRAGMA_STRUCT_PACKPUSH
  42.     #pragma pack(push, 2)
  43. #elif PRAGMA_STRUCT_PACK
  44.     #pragma pack(2)
  45. #endif
  46.  
  47. #if PRAGMA_ENUM_ALWAYSINT
  48.     #pragma enumsalwaysint on
  49. #elif PRAGMA_ENUM_OPTIONS
  50.     #pragma option enum=int
  51. #elif PRAGMA_ENUM_PACK
  52.     #if __option(pack_enums)
  53.         #define PRAGMA_ENUM_PACK__QD3DGROUP__
  54.     #endif
  55.     #pragma options(!pack_enums)
  56. #endif
  57.  
  58. /******************************************************************************
  59.  **                                                                             **
  60.  **                            Group Typedefs                                     **
  61.  **                                                                             **
  62.  *****************************************************************************/
  63. /*
  64.  * These flags affect how a group is traversed
  65.  * They apply to when a group is "drawn", "picked", "bounded", "written"
  66.  */
  67.  
  68. enum TQ3DisplayGroupStateMasks {
  69.     kQ3DisplayGroupStateNone    = 0,
  70.     kQ3DisplayGroupStateMaskIsDrawn = 1 << 0,
  71.     kQ3DisplayGroupStateMaskIsInline = 1 << 1,
  72.     kQ3DisplayGroupStateMaskUseBoundingBox = 1 << 2,
  73.     kQ3DisplayGroupStateMaskUseBoundingSphere = 1 << 3,
  74.     kQ3DisplayGroupStateMaskIsPicked = 1 << 4,
  75.     kQ3DisplayGroupStateMaskIsWritten = 1 << 5
  76. };
  77. typedef enum TQ3DisplayGroupStateMasks TQ3DisplayGroupStateMasks;
  78.  
  79. typedef unsigned long                     TQ3DisplayGroupState;
  80.  
  81.  
  82. /******************************************************************************
  83.  **                                                                             **
  84.  **                    Group Routines (apply to all groups)                     **
  85.  **                                                                             **
  86.  *****************************************************************************/
  87. /* May contain any shared object */
  88. EXTERN_API_C( TQ3GroupObject )
  89. Q3Group_New                        (void);
  90.  
  91. EXTERN_API_C( TQ3ObjectType )
  92. Q3Group_GetType                    (TQ3GroupObject         group);
  93.  
  94. EXTERN_API_C( TQ3GroupPosition )
  95. Q3Group_AddObject                (TQ3GroupObject         group,
  96.                                  TQ3Object                 object);
  97.  
  98. EXTERN_API_C( TQ3GroupPosition )
  99. Q3Group_AddObjectBefore            (TQ3GroupObject         group,
  100.                                  TQ3GroupPosition         position,
  101.                                  TQ3Object                 object);
  102.  
  103. EXTERN_API_C( TQ3GroupPosition )
  104. Q3Group_AddObjectAfter            (TQ3GroupObject         group,
  105.                                  TQ3GroupPosition         position,
  106.                                  TQ3Object                 object);
  107.  
  108. EXTERN_API_C( TQ3Status )
  109. Q3Group_GetPositionObject        (TQ3GroupObject         group,
  110.                                  TQ3GroupPosition         position,
  111.                                  TQ3Object *            object);
  112.  
  113. EXTERN_API_C( TQ3Status )
  114. Q3Group_SetPositionObject        (TQ3GroupObject         group,
  115.                                  TQ3GroupPosition         position,
  116.                                  TQ3Object                 object);
  117.  
  118. EXTERN_API_C( TQ3Object )
  119. Q3Group_RemovePosition            (TQ3GroupObject         group,
  120.                                  TQ3GroupPosition         position);
  121.  
  122. EXTERN_API_C( TQ3Status )
  123. Q3Group_GetFirstPosition        (TQ3GroupObject         group,
  124.                                  TQ3GroupPosition *        position);
  125.  
  126. EXTERN_API_C( TQ3Status )
  127. Q3Group_GetLastPosition            (TQ3GroupObject         group,
  128.                                  TQ3GroupPosition *        position);
  129.  
  130. EXTERN_API_C( TQ3Status )
  131. Q3Group_GetNextPosition            (TQ3GroupObject         group,
  132.                                  TQ3GroupPosition *        position);
  133.  
  134. EXTERN_API_C( TQ3Status )
  135. Q3Group_GetPreviousPosition        (TQ3GroupObject         group,
  136.                                  TQ3GroupPosition *        position);
  137.  
  138. EXTERN_API_C( TQ3Status )
  139. Q3Group_CountObjects            (TQ3GroupObject         group,
  140.                                  unsigned long *        nObjects);
  141.  
  142. EXTERN_API_C( TQ3Status )
  143. Q3Group_EmptyObjects            (TQ3GroupObject         group);
  144.  
  145. /*
  146.  *     Typed Access
  147.  */
  148. EXTERN_API_C( TQ3Status )
  149. Q3Group_GetFirstPositionOfType    (TQ3GroupObject         group,
  150.                                  TQ3ObjectType             isType,
  151.                                  TQ3GroupPosition *        position);
  152.  
  153. EXTERN_API_C( TQ3Status )
  154. Q3Group_GetLastPositionOfType    (TQ3GroupObject         group,
  155.                                  TQ3ObjectType             isType,
  156.                                  TQ3GroupPosition *        position);
  157.  
  158. EXTERN_API_C( TQ3Status )
  159. Q3Group_GetNextPositionOfType    (TQ3GroupObject         group,
  160.                                  TQ3ObjectType             isType,
  161.                                  TQ3GroupPosition *        position);
  162.  
  163. EXTERN_API_C( TQ3Status )
  164. Q3Group_GetPreviousPositionOfType (TQ3GroupObject         group,
  165.                                  TQ3ObjectType             isType,
  166.                                  TQ3GroupPosition *        position);
  167.  
  168. EXTERN_API_C( TQ3Status )
  169. Q3Group_CountObjectsOfType        (TQ3GroupObject         group,
  170.                                  TQ3ObjectType             isType,
  171.                                  unsigned long *        nObjects);
  172.  
  173. EXTERN_API_C( TQ3Status )
  174. Q3Group_EmptyObjectsOfType        (TQ3GroupObject         group,
  175.                                  TQ3ObjectType             isType);
  176.  
  177. /*
  178.  *    Determine position of objects in a group
  179.  */
  180. EXTERN_API_C( TQ3Status )
  181. Q3Group_GetFirstObjectPosition    (TQ3GroupObject         group,
  182.                                  TQ3Object                 object,
  183.                                  TQ3GroupPosition *        position);
  184.  
  185. EXTERN_API_C( TQ3Status )
  186. Q3Group_GetLastObjectPosition    (TQ3GroupObject         group,
  187.                                  TQ3Object                 object,
  188.                                  TQ3GroupPosition *        position);
  189.  
  190. EXTERN_API_C( TQ3Status )
  191. Q3Group_GetNextObjectPosition    (TQ3GroupObject         group,
  192.                                  TQ3Object                 object,
  193.                                  TQ3GroupPosition *        position);
  194.  
  195. EXTERN_API_C( TQ3Status )
  196. Q3Group_GetPreviousObjectPosition (TQ3GroupObject         group,
  197.                                  TQ3Object                 object,
  198.                                  TQ3GroupPosition *        position);
  199.  
  200.  
  201. /******************************************************************************
  202.  **                                                                             **
  203.  **                            Group Subclasses                                 **
  204.  **                                                                             **
  205.  *****************************************************************************/
  206. /* Must contain only lights */
  207. EXTERN_API_C( TQ3GroupObject )
  208. Q3LightGroup_New                (void);
  209.  
  210. /* Must contain only strings */
  211. EXTERN_API_C( TQ3GroupObject )
  212. Q3InfoGroup_New                    (void);
  213.  
  214. /******************************************************************************
  215.  **                                                                             **
  216.  **                        Display Group Routines                                 **
  217.  **                                                                             **
  218.  *****************************************************************************/
  219. /* May contain only drawables */
  220. EXTERN_API_C( TQ3GroupObject )
  221. Q3DisplayGroup_New                (void);
  222.  
  223. EXTERN_API_C( TQ3ObjectType )
  224. Q3DisplayGroup_GetType            (TQ3GroupObject         group);
  225.  
  226. EXTERN_API_C( TQ3Status )
  227. Q3DisplayGroup_GetState            (TQ3GroupObject         group,
  228.                                  TQ3DisplayGroupState *    state);
  229.  
  230. EXTERN_API_C( TQ3Status )
  231. Q3DisplayGroup_SetState            (TQ3GroupObject         group,
  232.                                  TQ3DisplayGroupState     state);
  233.  
  234. EXTERN_API_C( TQ3Status )
  235. Q3DisplayGroup_Submit            (TQ3GroupObject         group,
  236.                                  TQ3ViewObject             view);
  237.  
  238. EXTERN_API_C( TQ3Status )
  239. Q3DisplayGroup_SetAndUseBoundingBox (TQ3GroupObject     group,
  240.                                  TQ3BoundingBox *        bBox);
  241.  
  242. EXTERN_API_C( TQ3Status )
  243. Q3DisplayGroup_GetBoundingBox    (TQ3GroupObject         group,
  244.                                  TQ3BoundingBox *        bBox);
  245.  
  246. EXTERN_API_C( TQ3Status )
  247. Q3DisplayGroup_RemoveBoundingBox (TQ3GroupObject         group);
  248.  
  249. EXTERN_API_C( TQ3Status )
  250. Q3DisplayGroup_CalcAndUseBoundingBox (TQ3GroupObject     group,
  251.                                  TQ3ComputeBounds         computeBounds,
  252.                                  TQ3ViewObject             view);
  253.  
  254.  
  255. /******************************************************************************
  256.  **                                                                             **
  257.  **        Ordered Display Group                                                  **
  258.  **                                                                             **
  259.  **        Ordered display groups keep objects in order by the type of object:     **
  260.  **                                                                             **
  261.  **        1    kQ3ShapeTypeTransform                                             **
  262.  **        2    kQ3ShapeTypeStyle                                                  **
  263.  **        3    kQ3SetTypeAttribute                                                  **
  264.  **        4    kQ3ShapeTypeShader                                                  **
  265.  **        5    kQ3ShapeTypeCamera                                                  **
  266.  **        6    kQ3ShapeTypeLight                                                  **
  267.  **        7    kQ3ShapeTypeGeometry                                             **
  268.  **        8    kQ3ShapeTypeGroup                                                 **            
  269.  **        9    kQ3ShapeTypeUnknown                                                 **
  270.  **                                                                             **
  271.  **        Within a type, you are responsible for keeping things in order.         **
  272.  **                                                                             **
  273.  **        You may access and/or manipulate the group using the above types      **
  274.  **        (fast), or you may use any parent or leaf class types (slower).         **
  275.  **                                                                             **
  276.  **        Additional types will be added as functionality grows.                 **
  277.  **                                                                             **
  278.  **        The group calls which access by type are much faster for ordered     ** 
  279.  **        display group for the types above.                                     **
  280.  **                                                                             **
  281.  **        N.B. Lights and Cameras in groups are a no-op when drawn and will     **
  282.  **             post an error with the debug libraries.                         **
  283.  **                                                                             **
  284.  *****************************************************************************/
  285. EXTERN_API_C( TQ3GroupObject )
  286. Q3OrderedDisplayGroup_New        (void);
  287.  
  288. /******************************************************************************
  289.  **                                                                             **
  290.  **        IO Proxy Display Group                                                  **
  291.  **                                                                             **
  292.  **        IO Proxy display groups are used to place more than one              **
  293.  **        representation of an object in a metafile. For example, if you know     **
  294.  **        another program does not understand NURBPatches but does understand  **
  295.  **        Meshes, you may place a mesh and a NURB Patch in an IO Proxy Group,  **
  296.  **        and the reading program will select the desired representation.         **
  297.  **                                                                             **
  298.  **        Objects in an IO Proxy Display Group are placed in their preferencial**
  299.  **        order, with the FIRST object being the MOST preferred, the LAST      **
  300.  **        object the least preferred.                                             **
  301.  **                                                                             **
  302.  **        The behavior of an IO Proxy Display Group is that when drawn/picked/ **
  303.  **        bounded, the first object in the group that is not "Unknown" is used,**
  304.  **        and the other objects ignored.                                         **
  305.  **                                                                             **
  306.  *****************************************************************************/
  307. EXTERN_API_C( TQ3GroupObject )
  308. Q3IOProxyDisplayGroup_New        (void);
  309.  
  310. /******************************************************************************
  311.  **                                                                             **
  312.  **                        Group Extension Definitions                             **
  313.  **                                                                             **
  314.  *****************************************************************************/
  315. /*
  316.  *    Searching methods - OPTIONAL
  317.  */
  318. enum {
  319.     kQ3XMethodType_GroupAcceptObject = FOUR_CHAR_CODE('gaco')
  320. };
  321.  
  322. typedef CALLBACK_API_C( TQ3Boolean , TQ3XGroupAcceptObjectMethod )(TQ3GroupObject group, TQ3Object object);
  323. enum {
  324.     kQ3XMethodType_GroupAddObject = FOUR_CHAR_CODE('gado')
  325. };
  326.  
  327. typedef CALLBACK_API_C( TQ3GroupPosition , TQ3XGroupAddObjectMethod )(TQ3GroupObject group, TQ3Object object);
  328. enum {
  329.     kQ3XMethodType_GroupAddObjectBefore = FOUR_CHAR_CODE('gaob')
  330. };
  331.  
  332. typedef CALLBACK_API_C( TQ3GroupPosition , TQ3XGroupAddObjectBeforeMethod )(TQ3GroupObject group, TQ3GroupPosition position, TQ3Object object);
  333. enum {
  334.     kQ3XMethodType_GroupAddObjectAfter = FOUR_CHAR_CODE('gaoa')
  335. };
  336.  
  337. typedef CALLBACK_API_C( TQ3GroupPosition , TQ3XGroupAddObjectAfterMethod )(TQ3GroupObject group, TQ3GroupPosition position, TQ3Object object);
  338. enum {
  339.     kQ3XMethodType_GroupSetPositionObject = FOUR_CHAR_CODE('gspo')
  340. };
  341.  
  342. typedef CALLBACK_API_C( TQ3Status , TQ3XGroupSetPositionObjectMethod )(TQ3GroupObject group, TQ3GroupPosition gPos, TQ3Object obj);
  343. enum {
  344.     kQ3XMethodType_GroupRemovePosition = FOUR_CHAR_CODE('grmp')
  345. };
  346.  
  347. typedef CALLBACK_API_C( TQ3Object , TQ3XGroupRemovePositionMethod )(TQ3GroupObject group, TQ3GroupPosition position);
  348.  
  349.  
  350. /*
  351.  *    Searching methods - OPTIONAL - default uses above methods
  352.  */
  353. enum {
  354.     kQ3XMethodType_GroupGetFirstPositionOfType = FOUR_CHAR_CODE('gfrt')
  355. };
  356.  
  357. typedef CALLBACK_API_C( TQ3Status , TQ3XGroupGetFirstPositionOfTypeMethod )(TQ3GroupObject group, TQ3ObjectType isType, TQ3GroupPosition *gPos);
  358. enum {
  359.     kQ3XMethodType_GroupGetLastPositionOfType = FOUR_CHAR_CODE('glst')
  360. };
  361.  
  362. typedef CALLBACK_API_C( TQ3Status , TQ3XGroupGetLastPositionOfTypeMethod )(TQ3GroupObject group, TQ3ObjectType isType, TQ3GroupPosition *gPos);
  363. enum {
  364.     kQ3XMethodType_GroupGetNextPositionOfType = FOUR_CHAR_CODE('gnxt')
  365. };
  366.  
  367. typedef CALLBACK_API_C( TQ3Status , TQ3XGroupGetNextPositionOfTypeMethod )(TQ3GroupObject group, TQ3ObjectType isType, TQ3GroupPosition *gPos);
  368. enum {
  369.     kQ3XMethodType_GroupGetPrevPositionOfType = FOUR_CHAR_CODE('gpvt')
  370. };
  371.  
  372. typedef CALLBACK_API_C( TQ3Status , TQ3XGroupGetPrevPositionOfTypeMethod )(TQ3GroupObject group, TQ3ObjectType isType, TQ3GroupPosition *gPos);
  373. enum {
  374.     kQ3XMethodType_GroupCountObjectsOfType = FOUR_CHAR_CODE('gcnt')
  375. };
  376.  
  377. typedef CALLBACK_API_C( TQ3Status , TQ3XGroupCountObjectsOfTypeMethod )(TQ3GroupObject group, TQ3ObjectType isType, unsigned long *nObjects);
  378. enum {
  379.     kQ3XMethodType_GroupEmptyObjectsOfType = FOUR_CHAR_CODE('geot')
  380. };
  381.  
  382. typedef CALLBACK_API_C( TQ3Status , TQ3XGroupEmptyObjectsOfTypeMethod )(TQ3GroupObject group, TQ3ObjectType isType);
  383. enum {
  384.     kQ3XMethodType_GroupGetFirstObjectPosition = FOUR_CHAR_CODE('gfop')
  385. };
  386.  
  387. typedef CALLBACK_API_C( TQ3Status , TQ3XGroupGetFirstObjectPositionMethod )(TQ3GroupObject group, TQ3Object object, TQ3GroupPosition *gPos);
  388. enum {
  389.     kQ3XMethodType_GroupGetLastObjectPosition = FOUR_CHAR_CODE('glop')
  390. };
  391.  
  392. typedef CALLBACK_API_C( TQ3Status , TQ3XGroupGetLastObjectPositionMethod )(TQ3GroupObject group, TQ3Object object, TQ3GroupPosition *gPos);
  393. enum {
  394.     kQ3XMethodType_GroupGetNextObjectPosition = FOUR_CHAR_CODE('gnop')
  395. };
  396.  
  397. typedef CALLBACK_API_C( TQ3Status , TQ3XGroupGetNextObjectPositionMethod )(TQ3GroupObject group, TQ3Object object, TQ3GroupPosition *gPos);
  398. enum {
  399.     kQ3XMethodType_GroupGetPrevObjectPosition = FOUR_CHAR_CODE('gpop')
  400. };
  401.  
  402. typedef CALLBACK_API_C( TQ3Status , TQ3XGroupGetPrevObjectPositionMethod )(TQ3GroupObject group, TQ3Object object, TQ3GroupPosition *gPos);
  403.  
  404.  
  405. /*
  406.  *    Group Position Methods
  407.  */
  408. enum {
  409.     kQ3XMethodType_GroupPositionSize = FOUR_CHAR_CODE('ggpz')
  410. };
  411.  
  412. typedef unsigned long                     TQ3XMethodTypeGroupPositionSize;
  413. enum {
  414.     kQ3XMethodType_GroupPositionNew = FOUR_CHAR_CODE('ggpn')
  415. };
  416.  
  417. typedef CALLBACK_API_C( TQ3Status , TQ3XGroupPositionNewMethod )(void *gPos, TQ3Object object, const void *initData);
  418. enum {
  419.     kQ3XMethodType_GroupPositionCopy = FOUR_CHAR_CODE('ggpc')
  420. };
  421.  
  422. typedef CALLBACK_API_C( TQ3Status , TQ3XGroupPositionCopyMethod )(void *srcGPos, void *dstGPos);
  423. enum {
  424.     kQ3XMethodType_GroupPositionDelete = FOUR_CHAR_CODE('ggpd')
  425. };
  426.  
  427. typedef CALLBACK_API_C( void , TQ3XGroupPositionDeleteMethod )(void *gPos);
  428.  
  429.  
  430. /*
  431.  *    View Drawing Helpers
  432.  *    
  433.  *    TQ3XGroupStartIterateMethod
  434.  *
  435.  *        Pass back *object = NULL to NOT call EndIterate iterate
  436.  *        Pass back *object != NULL to draw object
  437.  *         (other side will pass it to EndIterate for deletion!)
  438.  *
  439.  *        *iterator is uninitialized, use for iteration state. Caller should 
  440.  *         ignore it.
  441.  *    
  442.  *    TQ3XGroupEndIterateMethod
  443.  *    
  444.  *        *object is previous object, dispose it or play with it.
  445.  *        Pass back NULL when last iteration has occurred
  446.  *        *iterator is previous value, use for iteration state Caller should 
  447.  *        ignore it.
  448.  */
  449. enum {
  450.     kQ3XMethodType_GroupStartIterate = FOUR_CHAR_CODE('gstd')
  451. };
  452.  
  453. typedef CALLBACK_API_C( TQ3Status , TQ3XGroupStartIterateMethod )(TQ3GroupObject group, TQ3GroupPosition *iterator, TQ3Object *object, TQ3ViewObject view);
  454. enum {
  455.     kQ3XMethodType_GroupEndIterate = FOUR_CHAR_CODE('gitd')
  456. };
  457.  
  458. typedef CALLBACK_API_C( TQ3Status , TQ3XGroupEndIterateMethod )(TQ3GroupObject group, TQ3GroupPosition *iterator, TQ3Object *object, TQ3ViewObject view);
  459.  
  460.  
  461. /*
  462.  *    IO  Helpers
  463.  *    
  464.  *    TQ3XGroupEndReadMethod
  465.  *        Called when a group has been completely read. Group should perform
  466.  *        validation and clean up any reading caches.
  467.  */
  468. enum {
  469.     kQ3XMethodType_GroupEndRead    = FOUR_CHAR_CODE('gerd')
  470. };
  471.  
  472. typedef CALLBACK_API_C( TQ3Status , TQ3XGroupEndReadMethod )(TQ3GroupObject group);
  473. EXTERN_API_C( void *)
  474. Q3XGroup_GetPositionPrivate        (TQ3GroupObject         group,
  475.                                  TQ3GroupPosition         position);
  476.  
  477.  
  478.  
  479.  
  480. #if PRAGMA_ENUM_ALWAYSINT
  481.     #pragma enumsalwaysint reset
  482. #elif PRAGMA_ENUM_OPTIONS
  483.     #pragma option enum=reset
  484. #elif defined(PRAGMA_ENUM_PACK__QD3DGROUP__)
  485.     #pragma options(pack_enums)
  486. #endif
  487.  
  488. #if PRAGMA_STRUCT_ALIGN
  489.     #pragma options align=reset
  490. #elif PRAGMA_STRUCT_PACKPUSH
  491.     #pragma pack(pop)
  492. #elif PRAGMA_STRUCT_PACK
  493.     #pragma pack()
  494. #endif
  495.  
  496. #ifdef PRAGMA_IMPORT_OFF
  497. #pragma import off
  498. #elif PRAGMA_IMPORT
  499. #pragma import reset
  500. #endif
  501.  
  502. #ifdef __cplusplus
  503. }
  504. #endif
  505.  
  506. #endif /* __QD3DGROUP__ */
  507.  
  508.